﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class LandschaftstexturFluss
    Inherits ObjektLandschaftsTextur

    ''' <summary>
    ''' 0=   1=+N   2=+N+O   3=+N+S   4=+N+O+S   5=+N+O+S+W
    ''' </summary>
    ''' <remarks></remarks>
    Dim UebergangsMeshs(5) As Objekt3D

    Dim TexturLandschaft As Texture

    Dim Wellenhoehe As Single = 0.03
    Dim Zeit As Single = 0
    Dim Ausbreitungsgeschwindigkeit As Single = 0.1
    Dim WellenzahlProFeld As Integer = 3
    Dim WellenEckpunkteProWelle As Integer = 10
    Dim Fliessgeschwindigkeit As Single = 0.003
    Dim FliessPosition As Single = 0

    Dim Wellen As List(Of CustomVertex.PositionNormalTextured())
    Public Sub New()
        ID = "FLUSS"
        Landschaftsname = "Fluss"
        Deckung = 0
        Tarnung = False
        KP = -1
        If DataSettings.draw3D Then
            TexturenLaden(New String() {"Fluss+N+S", "Fluss+S+W", "Fluss+N+S+W", "Fluss+N+W", "Fluss+O+W", "Fluss+N+O+W", "Fluss+N+O", "Fluss+N+O+S", "Fluss+O+S", "Fluss+O+S+W", "Fluss+N+O+S+W", "Fluss+W", "Fluss+O", "Fluss+S", "Fluss+N"})
            Frame = True
            Ini3D()
        Else
            Select Case DataSettings.TerrainStyle
                Case TerrainStyle.AdvanceWarsDC, TerrainStyle.CommanderWars2
                    TexturenLaden(New String() {"Fluss", "Fluss+N+S", "Fluss+S+W", "Fluss+N+S+W", "Fluss+N+W", "Fluss+O+W", "Fluss+N+O+W", "Fluss+N+O", "Fluss+N+O+S", "Fluss+O+S", "Fluss+O+S+W", "Fluss+N+O+S+W", "Fluss+W", "Fluss+O", "Fluss+S", "Fluss+N"})
                    Frame = False
                Case Else
                    TexturenLaden(New String() {"Fluss+N+S", "Fluss+S+W", "Fluss+N+S+W", "Fluss+N+W", "Fluss+O+W", "Fluss+N+O+W", "Fluss+N+O", "Fluss+N+O+S", "Fluss+O+S", "Fluss+O+S+W", "Fluss+N+O+S+W", "Fluss+W", "Fluss+O", "Fluss+S", "Fluss+N"})
                    Frame = True
            End Select
        End If
        Normal = 0
        Ausrichtungslandschaften = New String() {"FLUSS", "BRUECKE", "SEE", "ZUGBRUECKE", "BAUBRUECKE"}
        UebergaengeLaden("FLUSSMUENDUNG")
    End Sub

    Public Overrides Function DrawSpecialStyle(ByVal BildID As Integer, ByVal Fog As Nebelarten, ByVal Alpha As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal TerrainUntergrundID As Integer, ByVal TerrainUntergrundBildID As Integer, ByVal TerrainUntergrundID2 As Integer, ByVal TerrainUntergrundBildID2 As Integer, Optional ByVal FixedLocation As Boolean = False, Optional ByVal Top As Boolean = False) As Boolean
        Select Case DataSettings.TerrainStyle
            Case TerrainStyle.AdvanceWarsDC, TerrainStyle.CommanderWars2
                Return DrawTerrainUndUntergrund(Alpha, Fog, BildID, X, Y, 0, 0, TerrainUntergrundID, TerrainUntergrundBildID, TerrainUntergrundID2, TerrainUntergrundBildID2, FixedLocation, Top)
            Case Else
                Dim Frame As Integer = ObjektLandschaft.Frame
                If ObjektLandschaft.HochZaehlen < 0 Then
                    Frame = ObjektLandschaft.MaxFrames - Frame
                End If
                Return DrawTerrainUndUntergrund(Alpha, Fog, BildID, X, Y, Frame, ObjektLandschaft.MaxFrames + 1, TerrainUntergrundID, TerrainUntergrundBildID, TerrainUntergrundID2, TerrainUntergrundBildID2, FixedLocation, Top)
        End Select
    End Function

    Public Overrides Function GetTerrainUntergrund() As String()
        Return New String() {"EBENE", "WUESTE", "SCHNEE"}
    End Function

    Public Overrides Sub Malen3D(ByVal p_MatCube As Microsoft.DirectX.Matrix, ByVal Landschaft As ObjektLandschaft)


        Dim Rot As Single
        Dim Ausrichtung As String = getAusrichtungVereinfacht(Landschaft.KooX, Landschaft.KooY, Objektverwalter.Spielfeld, Rot)
        Dim Uebergaenge As String() = Ausrichtung.Split("+")



        Dim Ind As Integer
        Select Case Ausrichtung
            Case ""
                Ind = 0
            Case "+N"
                Ind = 1
            Case "+N+O"
                Ind = 2
            Case "+N+S"
                Ind = 3
            Case "+N+O+S"
                Ind = 4
            Case "+N+O+S+W"
                Ind = 5
        End Select
        Dim Mat As Matrix = Matrix.RotationY(Rot)
        Mat.M41 = p_MatCube.M41 + 0.5
        Mat.M42 = p_MatCube.M42
        Mat.M43 = p_MatCube.M43 + 0.5
        'UebergangsMeshs(ind).Malen(Mat)

        Grafikengine.Grafikkarte.SetTexture(0, TexturLandschaft)
        'Berechnen:
        Dim Farbe As Color = ObjektmarkiertesFeld.getFeldFarbe(Landschaft.KooX, Landschaft.KooY)
        Select Case Uebergaenge.Length
            Case 1

            Case 2

            Case 3
                If (Uebergaenge(1) = "N" And Uebergaenge(2) = "S") Then
                    'Gerade
                    If Landschaft.Abflussrichtung = KompassRichtungen.N Then
                        Rot += Math.PI
                    ElseIf Landschaft.Abflussrichtung = KompassRichtungen.O Then
                        Rot += Math.PI
                    End If

                    Dim Wellen(WellenEckpunkteProWelle * WellenzahlProFeld * 2 + 1) As CustomVertex.PositionNormalTextured
                    Dim i As Integer = 0
                    For z = 0 To 1 + 1 / (WellenEckpunkteProWelle * WellenzahlProFeld) Step 1 / (WellenEckpunkteProWelle * WellenzahlProFeld)
                        Wellen(2 * i + 1) = New CustomVertex.PositionNormalTextured(New Vector3(-0.5, Wellenhoehe * Math.Sin(z * (2 * Math.PI * WellenzahlProFeld) + Zeit) + Meereshoehe, z - 0.5), Vector3.Normalize(New Vector3(0, 1, -Math.Cos(z * (2 * Math.PI * WellenzahlProFeld) + Zeit))), FliessPosition + z, 1)
                        Wellen(2 * i) = New CustomVertex.PositionNormalTextured(New Vector3(0.5, Wellenhoehe * Math.Sin(z * (2 * Math.PI * WellenzahlProFeld) + Zeit) + Meereshoehe, z - 0.5), Vector3.Normalize(New Vector3(0, 1, -Math.Cos(z * (2 * Math.PI * WellenzahlProFeld) + Zeit))), FliessPosition + z, 0)
                        i += 1
                    Next

                    DrawFluss(p_MatCube, Rot, Wellen, Farbe, WellenEckpunkteProWelle * WellenzahlProFeld * 2)
                Else
                    Dim NeueWellenZahl As Integer = 1.5 * WellenzahlProFeld
                    'Kurve
                    Dim Wellen(WellenEckpunkteProWelle * NeueWellenZahl * 2 + 1) As CustomVertex.PositionNormalTextured
                    Dim i As Integer = 0
                    Dim PhiStep As Single = (Math.PI / 2) / (WellenEckpunkteProWelle * NeueWellenZahl)
                    Dim Phi As Single = 0
                    Dim Z As Single = 0
                    While i * 2 < Wellen.Length
                        'Rand
                        Wellen(2 * i) = New CustomVertex.PositionNormalTextured(New Vector3(0.5 - Math.Cos(Phi), Wellenhoehe * Math.Sin(Z * (2 * Math.PI * NeueWellenZahl) + Zeit) + Meereshoehe, 0.5 - Math.Sin(Phi)), New Vector3, FliessPosition + Z, 1)
                        'Ecke
                        'Wellen(2 * i + 1) = New CustomVertex.PositionNormalTextured(New Vector3(0.5, Wellenhoehe * Math.Sin(z * (2 * Math.PI * WellenzahlProFeld) + Zeit) + Meereshoehe, 0.5), New Vector3, FliessPosition, 0)
                        Wellen(2 * i + 1) = New CustomVertex.PositionNormalTextured(New Vector3(0.5, Wellenhoehe * Math.Sin(Zeit) + Meereshoehe, 0.5), New Vector3, FliessPosition, 0)
                        'Normalen Vektoren
                        If i >= 2 Then
                            'Rand
                            Wellen(2 * i - 2).Normal = -Vector3.Normalize(Vector3.Cross(Wellen(2 * i).Position - Wellen(2 * i - 4).Position, Wellen(2 * i - 1).Position - Wellen(2 * i - 2).Position))
                            'Ecke
                            Wellen(2 * i - 1).Normal = Wellen(2 * i - 2).Normal '-Vector3.Normalize(Vector3.Cross(Wellen(2 * i + 1).Position - Wellen(2 * i - 3).Position, Wellen(2 * i - 1).Position - Wellen(2 * i - 2).Position))
                        End If
                        Z += 1 / (WellenEckpunkteProWelle * NeueWellenZahl)
                        i += 1
                        Phi += PhiStep
                    End While
                    Wellen(0).Normal = Vector3.Normalize(New Vector3(0, 1, -Math.Cos(Zeit)))
                    Wellen(1).Normal = Vector3.Normalize(New Vector3(0, 1, -Math.Cos(Zeit)))
                    Wellen(Wellen.Length - 1).Normal = Vector3.Normalize(New Vector3(0, 1, -Math.Cos(Zeit)))
                    Wellen(Wellen.Length - 2).Normal = Vector3.Normalize(New Vector3(0, 1, -Math.Cos(Zeit)))

                    DrawFluss(p_MatCube, Rot, Wellen, Farbe, WellenEckpunkteProWelle * NeueWellenZahl * 2)

                End If
            Case 4

            Case 5


        End Select


    End Sub

    Private Sub DrawFluss(ByVal p_MatCube As Matrix, ByVal Rot As Single, ByVal Wellen As CustomVertex.PositionNormalTextured(), ByVal Farbe As Color, ByVal Wellenzahl As Integer)
        Dim standardMatrix As Matrix = Grafikengine.Grafikkarte.Transform.World

        Dim Mat As Matrix = Matrix.RotationY(Rot)
        Mat.M41 = p_MatCube.M41 + 0.5
        Mat.M42 = p_MatCube.M42
        Mat.M43 = p_MatCube.M43 + 0.5


        'Anzeigen:
        Dim M As New Material
        M.Diffuse = Farbe
        Grafikengine.Grafikkarte.Material = M

        Grafikengine.Grafikkarte.VertexFormat = CustomVertex.PositionNormalTextured.Format

        Grafikengine.Grafikkarte.Transform.World = Mat

        Grafikengine.Grafikkarte.DrawUserPrimitives(PrimitiveType.TriangleStrip, Wellenzahl, Wellen)


        'Wieder den Ursprungsstatus wiederherstellen..
        Grafikengine.Grafikkarte.Transform.World = standardMatrix
    End Sub

    Public Overrides Function getFigurPos(ByVal Pos As ObjektLandschaftsTextur.Positionsarten) As Microsoft.DirectX.Vector3
        Select Case Pos
            Case Positionsarten.Luft
                Return MyBase.getFigurPos(Pos)
            Case Positionsarten.Boden
                Return New Vector3(0.5, Meereshoehe - Wellenhoehe * 2, 0.5)
            Case Else
                Return MyBase.getFigurPos(Pos)
        End Select
    End Function


    Public Overrides Sub Ini3D()
        UebergangsMeshs(0) = New Objekt3D()
        UebergangsMeshs(1) = New Objekt3D()
        UebergangsMeshs(2) = New Objekt3D()
        UebergangsMeshs(3) = New Objekt3D()
        UebergangsMeshs(4) = New Objekt3D()
        UebergangsMeshs(5) = New Objekt3D()
        UebergangsMeshs(0).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Bruecke.x")
        UebergangsMeshs(1).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Bruecke+N.x")
        UebergangsMeshs(2).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Bruecke+N+O.x")
        UebergangsMeshs(3).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Bruecke+N+S.x")
        UebergangsMeshs(4).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Bruecke+N+O+S.x")
        UebergangsMeshs(5).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Bruecke+N+O+S+W.x")
        'UebergangsMeshs(0).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Fluss.x")
        'UebergangsMeshs(1).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Fluss+N.x")
        'UebergangsMeshs(2).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Fluss+N+O.x")
        'UebergangsMeshs(3).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Fluss+N+S.x")
        'UebergangsMeshs(4).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Fluss+N+O+S.x")
        'UebergangsMeshs(5).MeshBildLaden(DataSettings.Resourcenpfad + "Terrain\Meshes\Fluss+N+O+S+W.x")
        TexturLandschaft = Grafikengine.LoadTexture(DataSettings.Resourcenpfad + "Terrain\Overworld\3D\" + DataSettings.TexturQuali + "\Wasser.png")
    End Sub

    Public Overrides Sub Tick()
        Zeit += Ausbreitungsgeschwindigkeit
        If Zeit > 2 * Math.PI Then
            Zeit -= 2 * Math.PI
        End If

        FliessPosition += Fliessgeschwindigkeit
        If FliessPosition > 1 Then
            FliessPosition -= 1
        End If
    End Sub
End Class
Public Class LandschaftstexturAusgetrocknetesFlussbett
    Inherits ObjektLandschaftsTextur



    Public Sub New()
        ID = "AUSGETROCKNETESFLUSSBETT"
        Landschaftsname = "Ausgetrocknetes Flussbett"
        Deckung = 1
        Tarnung = False
        KP = -1
        If DataSettings.draw3D Then
            TexturenLaden(New String() {"AusgetrocknetesFlussbett+N+S", "AusgetrocknetesFlussbett+S+W", "AusgetrocknetesFlussbett+N+S+W", "AusgetrocknetesFlussbett+N+W", "AusgetrocknetesFlussbett+O+W", "AusgetrocknetesFlussbett+N+O+W", "AusgetrocknetesFlussbett+N+O", "AusgetrocknetesFlussbett+N+O+S", "AusgetrocknetesFlussbett+O+S", "AusgetrocknetesFlussbett+O+S+W", "AusgetrocknetesFlussbett+N+O+S+W", "AusgetrocknetesFlussbett+W", "AusgetrocknetesFlussbett+O", "AusgetrocknetesFlussbett+S", "AusgetrocknetesFlussbett+N"})
        Else
            Select Case DataSettings.TerrainStyle
                Case TerrainStyle.CommanderWars2, TerrainStyle.AdvanceWarsDC
                    TexturenLaden(New String() {"AusgetrocknetesFlussbett", "AusgetrocknetesFlussbett+N+S", "AusgetrocknetesFlussbett+S+W", "AusgetrocknetesFlussbett+N+S+W", "AusgetrocknetesFlussbett+N+W", "AusgetrocknetesFlussbett+O+W", "AusgetrocknetesFlussbett+N+O+W", "AusgetrocknetesFlussbett+N+O", "AusgetrocknetesFlussbett+N+O+S", "AusgetrocknetesFlussbett+O+S", "AusgetrocknetesFlussbett+O+S+W", "AusgetrocknetesFlussbett+N+O+S+W", "AusgetrocknetesFlussbett+W", "AusgetrocknetesFlussbett+O", "AusgetrocknetesFlussbett+S", "AusgetrocknetesFlussbett+N"})
                Case Else
                    TexturenLaden(New String() {"AusgetrocknetesFlussbett+N+S", "AusgetrocknetesFlussbett+S+W", "AusgetrocknetesFlussbett+N+S+W", "AusgetrocknetesFlussbett+N+W", "AusgetrocknetesFlussbett+O+W", "AusgetrocknetesFlussbett+N+O+W", "AusgetrocknetesFlussbett+N+O", "AusgetrocknetesFlussbett+N+O+S", "AusgetrocknetesFlussbett+O+S", "AusgetrocknetesFlussbett+O+S+W", "AusgetrocknetesFlussbett+N+O+S+W", "AusgetrocknetesFlussbett+W", "AusgetrocknetesFlussbett+O", "AusgetrocknetesFlussbett+S", "AusgetrocknetesFlussbett+N"})
            End Select
        End If
        Normal = 0
        Ausrichtungslandschaften = New String() {"AUSGETROCKNETESFLUSSBETT", "BRUECKE", "WUESTENBRUECKE", "ZUGBRUECKE", "BAUBRUECKE"}
        UebergaengeLaden("WUESTE")
    End Sub

    Public Overrides Sub Malen3D(ByVal p_MatCube As Microsoft.DirectX.Matrix, ByVal Landschaft As ObjektLandschaft)

    End Sub

    Public Overrides Sub Ini3D()

    End Sub

    Public Overrides Sub Tick()

    End Sub

End Class
